import {
  addAddressApi,
  editAddressApi,
  editDefaultAddressApi,
  getAddressListApi,
  getDefaultAddressIdApi,
  removeAddressApi,
} from "@/api/address"

export default {
  namespaced: true,
  state() {
    return {
      addressList: [], // 地址列表
      defaultAddressId: 0, // 默认地址id，类型是number，所以初始值设为0
    }
  },
  mutations: {
    SET_ADDRESS_LIST(state, addressList) {
      state.addressList = addressList
    },

    SET_DEFAULT_ADDRESS_ID(state, defaultId) {
      state.defaultAddressId = defaultId
    },

  },
  actions: {
    // 请求地址列表
    async getAddressList(context, options = {needForceRefresh: false}) {
      const needForceRefresh = options.needForceRefresh
      const hasCachedData = context.state.addressList.length > 0

      // 如果有缓存且不需要强制刷新，直接使用缓存
      if (hasCachedData && !needForceRefresh) return

      const res = await getAddressListApi()
      let arr = res.data.list

      context.commit('SET_ADDRESS_LIST', arr)
    },

    // 请求后端的默认地址id
    async getDefaultAddressId(context, options = {needForceRefresh: false}) {
      const needForceRefresh = options.needForceRefresh
      const hasCachedData = context.state.defaultAddressId

      // 如果有缓存且不需要强制刷新，直接使用缓存
      if (hasCachedData && !needForceRefresh) return

      // 请求后端的默认地址id
      const res = await getDefaultAddressIdApi()

      // 修改前端默认id
      context.commit('SET_DEFAULT_ADDRESS_ID', res.data.defaultId)
    },

    // 修改默认地址id
    async editDefaultAddress(context, address_id) {

      context.commit('SET_DEFAULT_ADDRESS_ID', address_id) // 修改前端默认id

      await editDefaultAddressApi(address_id) // 修改后端默认地址id
    },

    // 编辑地址，修改的是地址列表
    async editAddress({dispatch}, addressData) {
      // 调用后端 API
      await editAddressApi(addressData)

      // 重新拉取后端地址列表数据
      await dispatch('getAddressList', {needForceRefresh: true})
    },

    // 删除地址
    async removeAddress(context, addressId) {
      // 1. 先删除后端的地址
      await removeAddressApi(addressId)

      // 2. 如果删除的是默认地址，后端的默认地址id会自动变为0，只要修改前端的默认地址就行
      if (addressId === context.state.defaultAddressId) {
        await context.commit('SET_DEFAULT_ADDRESS_ID', 0)
      }

      // 3. 重新获取列表，而且删除地址成功后会停留在当前页面，这里需要拉取一次后端数据
      await context.dispatch('getAddressList', {needForceRefresh: true})
    },

    // 添加地址
    async addAddress(context, addressData) {
      // 调用后端 API
      await addAddressApi(addressData)

      // 重新拉取后端列表数据
      await context.dispatch('getAddressList', {needForceRefresh: true})
    }
  },
  getters: {},
}
